package com.example.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.common.Result;
import com.example.domain.VoucherOrder;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpSession;

/**
 * @author chenliang
 * @description 针对表【tb_voucher_order】的数据库操作Service
 * @createDate 2024-07-02 20:19:30
 */
public interface VoucherOrderService extends IService<VoucherOrder> {
    /**
     * 优惠券秒杀——利用乐观锁解决超卖问题
     * 乐观锁
     * 1、库存CAS
     * 2、版本号法
     *
     * @param voucherId
     * @param session
     * @return
     */
    Result seckillVoucher(Long voucherId, HttpSession session);

    /**
     * 上一个方法基础之上，解决一人一单问题
     * 悲观锁方案
     *
     * @param voucherId
     * @param session
     * @return
     */
    @Transactional
    Result seckillVoucher02(Long voucherId, HttpSession session);

    /**
     * 上一个方法基础之上，解决一人一单问题
     * 分布式锁方案一
     *
     * @param voucherId
     * @param session
     * @return
     */
    Result seckillVoucher03(Long voucherId, HttpSession session);

    /**
     * 上一个方法基础之上，解决一人一单问题
     * 分布式锁方案二：Lua脚本
     *
     * @param voucherId
     * @param session
     * @return
     */
    Result seckillVoucher04(Long voucherId, HttpSession session);

    Result seckillVoucher05(Long voucherId, HttpSession session);

    /**
     * 创建订单逻辑封装
     *
     * @param voucherId
     * @return
     */
    Result createVoucherOrder(Long voucherId);
}
